package models;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;

public class Zbior {
	private Punkt[] data;
	private int liczbaKlas;
	private int liczbaCech;
	private int licznoscZbioru;

	public Zbior(String plik) {
		try {
			File zb = new File(plik);
			BufferedReader r = new BufferedReader(new FileReader(zb));
			String cfgs = r.readLine();
			String[] parametry = cfgs.split(" ");
			this.liczbaKlas = Integer.parseInt(parametry[0]);
			this.liczbaCech = Integer.parseInt(parametry[1]);
			this.licznoscZbioru = Integer.parseInt(parametry[2]);
			this.data = new Punkt[this.licznoscZbioru];
			for (int i = 0; i < this.licznoscZbioru; ++i) {
				String[] temp = r.readLine().trim().split("\\s+");
				int klasa = Integer.parseInt(temp[0]);
				double tempData[] = new double[this.liczbaCech];
				for (int c = 1; c <= this.liczbaCech; ++c) {
					tempData[c - 1] = Double.parseDouble(temp[c]);
				}
				this.data[i] = new Punkt(klasa, tempData);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Zbior(Punkt[] p, int lCech) {
		this.data = p;
		this.licznoscZbioru = p.length;
		this.liczbaCech = lCech;
		this.liczbaKlas = -1;
	}

	public void insert(int i, Punkt p) {
		if (i >= 0 && i < this.licznoscZbioru) {
			this.data[i] = p;
		}
	}

	public void dodajJesliNajblizszy(Punkt p) {
		if(this.data[this.licznoscZbioru-1].getMetryka()>p.getMetryka()){
			this.insert(this.licznoscZbioru-1, p);
		}
		this.sort();
	}

	public void sort() {
		int n = this.data.length;
		do {
			for (int i = 0; i < n - 1; ++i) {
				if (this.data[i].getMetryka() > this.data[i + 1].getMetryka()) {
					Punkt temp;
					temp = this.getData(i);
					this.insert(i, this.getData(i + 1));
					this.insert(i + 1, temp);
				}
			}
			n -= 1;
		} while (n > 1);

	}

	public Punkt[] getData() {
		return data;
	}

	public Punkt getData(int i) {
		if (i >= 0 && i < this.licznoscZbioru) {
			return this.data[i];
		}
		return null;
	}

	public int getLiczbaKlas() {
		return liczbaKlas;
	}

	public int getLiczbaCech() {
		return liczbaCech;
	}

	public int getLicznoscZbioru() {
		return licznoscZbioru;
	}

}
